//
//
//
//  @ Project : Untitled
//  @ File Name : PageContent.h
//  @ Date : 2011/4/15
//  @ Author : 
//
//


#if !defined(_PAGECONTENT_H)
#define _PAGECONTENT_H

namespace PageSystem
{
	class PageContentFactory;
	class PageContentCollection;
	class PageManager;
	class SceneManager;
	class StreamSerialiser;
	class PageCamera;
	/** Interface definition for a unit of content within a page. 
	*/
	class  PageContent //: public PageAlloc
	{
	protected:
		PageContentFactory* mCreator;
		PageContentCollection* mParent;
	public:
		PageContent(PageContentFactory* creator);
		virtual ~PageContent();

		PageManager* getManager() const;
		SceneManager* getSceneManager() const;

		/// Internal method to notify a page that it is attached
		virtual void _notifyAttached(PageContentCollection* parent);
		/// Get the type of the content, which will match it's factory
		virtual const String& getType() const;

		/// Save the content to a stream
		virtual void save(StreamSerialiser& stream) = 0;
		/// Called when the frame starts
		virtual void frameStart(Real timeSinceLastFrame) {}
		/// Called when the frame ends
		virtual void frameEnd(Real timeElapsed) {}
		/// Notify a section of the current PageCamera
		virtual void notifyPageCamera(PageCamera* cam) {}

		/// Prepare data - may be called in the background
		virtual bool prepare(StreamSerialiser& ser) = 0;
		/// Load - will be called in main thread
		virtual void load() = 0;
		/// Unload - will be called in main thread
		virtual void unload() = 0;
		/// Unprepare data - may be called in the background
		virtual void unprepare() = 0;

	};
}
#endif  //_PAGECONTENT_H
